最終更新 1999.4.30
本稿では、Windows NTのOSローダーを用いて、複数のOSを選択ブートする方法について解説します。対象機種はPC/AT互換機で、 OSはMS-DOS、Windows 95、Windows NT、FreeBSD、Linuxです。
本稿の内容は、参考文献に示したWWWページの内容に基づいています。そちらもあわせて熟読されることをおすすめします。
なお、本稿の内容を運用した結果について筆者は責任を負いません。手順を誤ると、OSがブートしなくなったり、パーティションがアクセス不能になったりするおそれがあります。十分に内容を理解した上で慎重に作業を行ってください。
ここでは、本題に入る前の予備知識として、 AT互換機の起動処理、Windows NT/95のブート処理について簡単に解説します。すでに知っている方は読み飛ばしてください。
POST終了後、BIOSは1台目のHDDのマスターブートレコード(MBR)を読み出し、処理を移します。 MBRはパーティションテーブルを保持しており、アクティブな基本パーティションのパーティションブートレコード(PBR)を読み出し、処理を移します。 PBRはOSをブートします。 MBRは特定のOSには依存しませんが、PBRはOSやファイルシステムに依存します。
このように、標準のブート処理はきわめて限定されたものであり、 PC-98のように起動時にOSを選択することなどはできません。そのため、さまざまなブートセレクターが出回っています。
NTは、PBRから起動される独自のブートセレクターを持っています。これは、NTのブートに密接に関係していますが、他のOS(のPBR)をブートすることもできます。
NTをインストールすると、 1台目のHDDのアクティブな基本パーティション(ドライブC:)のPBRに、 NTのPBRが書き込まれます。 C:にすでに他のOS(通常はDOS/Win95)がある場合、古いPBRはBOOTSECT.DOSとして保存されます。
このパーティションを起動すると、 NTのPBRは、NTLDRをロードして処理を移します。 NTLDRは、BOOT.INIを読み込んでOSローダー画面を表示し、ブートするOSをユーザーに選択させます。ここで、NTが選択されると、 NTDETECT.COMを呼び出してハードウェアの構成を調査させ、カーネル(NTOSKRNL.EXEまたはNTMPKRNL.EXE)をロードしてNTをブートします。 NT以外のOSが選択されると、 BOOT.INIで指定したPBRイメージファイル(デフォルトはBOOTSECT.DOS)を読み込み、処理を移します。これにより、MBRから直接そのPBRが呼ばれたのと同じ状況になるため、目的のOSをブートすることができます。
| ファイル名 | 内容 |
|---|---|
| NTLDR | OSローダー本体 |
| NTDETECT.COM | ハードウェアの構成を調査する |
| BOOT.INI | OSローダーの設定 |
| BOOTFONT.BIN | 日本語フォント |
| BOOTSECT.DOS | 元のPBR |
| NTBOOTDD.SYS | SCSIドライバ |
BOOT.INIがないと、デフォルトのパス
multi(0)disk(0)rdisk(0)partition(1)\WINNT
からNTをブートします。 BOOTFONT.BINがないと、OSローダーは英語モードで動作します。 NTBOOTDD.SYSは、BIOSを持たないSCSIカードに接続されたHDDからのブートに使われます (実体は、そのSCSIカードのNT用デバイスドライバそのものらしいです)。
DOSがインストールされているパーティションにWindows 95をインストールした場合、 95とDOSの選択ブートが可能になります。これは、両方のシステムファイル(IO.SYSやMSDOS.SYSなど)を保持しておき、ブート時に起動メニューなどの選択によってリネームして入れかえることで実現されています。
| ファイル名 | DOS版 | Win95版 |
|---|---|---|
| IO.SYS | IO.DOS | WINBOOT.SYS |
| MSDOS.SYS | MSDOS.DOS | MSDOS.W40 |
| COMMAND.COM | COMMAND.DOS | COMMAND.W40 |
| CONFIG.SYS | CONFIG.DOS | CONFIG.W40 |
| AUTOEXEC.BAT | AUTOEXEC.DOS | AUTOEXEC.W40 |
なお、PC DOSではIO.SYSとMSDOS.SYSのかわりに IBMBIO.COMとIBMDOS.COMというファイル名になっています。ここに95をインストールすると、空のIO.DOSとMSDOS.DOSが作られてしまい、起動メニューからPC DOSをブートできなくなることがあります。その場合は、これらのファイルを消してください。
対象とするOSは以下の通りです。
ここでは、1台のEIDE HDDにすべてインストールする以下のような構成を想定します。
| パーティション | OS | ファイルシステム | ドライブ名 | ARCパーティション番号 | FreeBSDデバイス名 | Linuxデバイス名 |
|---|---|---|---|---|---|---|
| 基本 | PC DOS、Windows 95 | VFAT16 | C: | 1 | wd0s1 | hda1 |
| 基本 | FreeBSD | UFS | -- | 2 | wd0s2 | hda2 |
| 拡張 | Windows NT | VFAT16/NTFS | D: | 3 | wd0s5 | hda5 |
| Linux | swap | -- | 4 | wd0s6 | hda6 | |
| ext2 | -- | 5 | wd0s7 | hda7 |
DOSとWindows 95は同一の基本パーティションに、 NTとFreeBSDとLinuxはそれぞれ独立のパーティションにインストールするものとします。NTとLinuxは拡張パーティションにインストールできますので、基本パーティションを節約するためにそうしています。
なお、LinuxにUFSサポートを組み込んだ場合、 FreeBSDのパーティション(スライス)中にある各UFSパーティションが/dev/hda5以降に割り当てられますので、 Linuxのパーティションのデバイス名が変化します。
OSローダーでNT以外のOSをブートするためには、そのOSのPBRのイメージファイルを作る必要があります。ファイル名はなんでもかまいませんが、ここでは筆者の趣味(※)で以下のようにします。 BOOTSECT.DOSというファイル名のファイルを用意する必要はありません。
| OS | ファイル名 |
|---|---|
| PC DOS | PCDOS.PBR |
| Windows 95 | WIN95.PBR |
| FreeBSD | FREEBSD.PBR |
| Linux | LINUX.PBR |
ファイルを置いておくディレクトリもどこでもよいのですが、ここではC:\に置くことにします。
※ 他の文献ではBOOTSECT.DOSに倣ってBOOTSECT.W95とかBOOTSECT.LNXなどとしていますが、拡張子はファイルの形式を表すものであるという原則に立てば、このようなネーミングは不適切といえます。
それでは、各OSのPBRのイメージファイルを作る方法を説明します。作業の前に、インストールした各OSが通常の手順で正しくブートすることを確認してください。また、非常時に備えて、各OSのインストール(ブート)メディアと緊急用ブートフロッピーを必ず用意しておきましょう。
ドライブC:にDOSのみがインストールされている場合は、 DEBUGコマンドなどでドライブC:のPBRをファイル化します(具体的な手順は後述)。
DOSとNTがインストールされている場合は、ドライブC:のPBRがNTのもので書き換えられている代わりに、 DOSのPBRはBOOTSECT.DOSとして保存されているので、これをそのまま使うことができます。
DOSと95がインストールされている場合、 PBRは95のもので上書きされています (NTもインストールされている場合は、PBRはNTのもので、 BOOTSECT.DOSは95のものになっています)。この場合は、フロッピーなどでDOSをブートし、 SYSコマンドでDOSのPBRを復元(SYS C:)してからファイル化します。この際、SYSコマンドによって95のシステムファイルが上書きされないよう、あらかじめ95の起動メニューからDOSをブートしておくか、システムファイルを適切にリネームしておく必要があります。また、作業後にドライブC:の95/NTのPBRを復旧する必要がありますが、このためには、DEBUGなどでPBRを退避・復旧します。 NTの場合はインストールフロッピーを起動して修復プロセスでもOKです。
NTと95がインストールされている場合は、 BOOTSECT.DOSに95のPBRが保存されているので、これを使います。 NTがインストールされていない場合は、 DEBUGなどでファイル化するか、 NTをインストールしてBOOTSECT.DOSを作らせます。
liloをPBRまたはフロッピーにインストール後、 dd(1)でファイル化します。
# mount -t msdos /dev/hda1 /dos # dd if=/dev/hda7 of=/dos/LINUX.PBR bs=512 count=1
フロッピーの場合は、 /dev/hda7のかわりに/dev/fd0などとなります。
なお、MBRにliloをインストールした状態でPBRをファイル化すると、うまくブートしないようです。また、カーネルの再構築(=liloの再構築)や、再インストールをした場合は、イメージファイルを作り直す必要があります。
dd(1)でファイル化します。
# mount -t msdos /dev/wd0s1 /dos # dd if=/dev/rwd0s2 of=/dos/FREEBSD.PBR bs=512 count=1
なお、これで得られるファイルは、 /usr/mdec/boot1と同じものなので、単に
$ cp /usr/mdec/boot1 /dos/FREEBSD.PBR
でもよいでしょう。
まっさらなHDDに新規にインストールする場合は、以下の順序をお勧めします。
NTをインストールした後のBOOT.INIは、次のようになっていることと思います。
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(3)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(3)\WINNT="Windows NT Workstation 4.00" multi(0)disk(0)rdisk(0)partition(3)\WINNT="Windows NT Workstation 4.00 [VGA mode]" /basevideo /sos C:\="Microsoft Windows"
[operating systems]セクションには、ブートするOSの名称とその所在を記述します。所在は、NTの場合はSystemRootディレクトリをARCパス名で記述し、他のOSの場合はPBRのイメージファイルをフルパスで記述します (ファイル名を省略するとBOOTSECT.DOSとみなされます)。
[boot loader]セクションについてはとくに説明の必要はないでしょう。なお、timeoutに-1を指定するとタイムアウトが無効になります。
以上から、マルチOSブートを実現するためには、 PBRイメージファイル(*.PBR)をC:\におき、 BOOT.INIを以下のように記述します。
[boot loader] timeout=30 default=C:\PCDOS.PBR [Operating Systems] multi(0)disk(0)rdisk(0)partition(3)\WINNT="Windows NT" multi(0)disk(0)rdisk(0)partition(3)\WINNT="Windows NT [VGA mode]" /basevideo /sos C:\PCDOS.PBR="PC DOS/V" /win95dos C:\WIN95.PBR="Windows 95" /win95 C:\FREEBSD.PBR="FreeBSD" C:\LINUX.PBR="Linux"
ここで、DOSのエントリについている/win95dosスイッチと、 95のエントリについている/win95スイッチが重要です。これらは、OSローダーの非公式な機能で、 95の起動メニューと同様にシステムファイルのリネームを行います。この機能はNT 3.51以降のOSローダーで有効です。
なお、ここではタイムアウト時にPC DOSをブートするように指定していますが、もちろん他のOSを指定してもかまいません。
MBRに何らかのブートセレクター(lilo、booteasyなど)が入っている場合は、わずらわしくないよう、外しておきます。 DOSでFDISK /MBRとするのが簡単です。
ここでは、NTをインストールせずにOSローダーのみをインストールする方法を説明します。前提とする構成は、前章の構成からNTを除いたものとします。
以下のような手順を踏みます。
ここは前と同じですので省略します。ただし、NTのインストーラーがBOOTSECT.DOSを作ってくれるということはありませんので、 DOS/Win95のDEBUGコマンドやUNIXのddコマンドですべて作る必要があります。
NTのCD-ROMから、NTLDRとBOOTFONT.BINをC:\にコピーします。 NTをブートするわけではないのでNTDETECT.COMは不要です。また、英語表示でかまわなければBOOTFONT.BINも不要です。
エディタを使ってBOOT.INIを書きます。ここでは以下のようにします。
[boot loader] timeout=30 default=C:\PCDOS.PBR [Operating Systems] C:\PCDOS.PBR="PC DOS/V" /win95dos C:\WIN95.PBR="Windows 95" /win95 C:\FREEBSD.PBR="FreeBSD" C:\LINUX.PBR="Linux"
C:のPBRを、NTのもので置き換えます。 NTの修復インストールで「ブートセクタの検査」を選べばよいように思いますが、実際にやってみると、修復ディスクがあるかNTをインストールしてあることを要求されるので、うまくいきません。ここでは、NTのセットアップディスクからブートレコードを読み出し、PBRとして利用します。ただし、これはNTLDRの代わりにSETUPLDR.BINを読むようになっているので、そこを書き換える必要があります。また、PBRにはBPB(BIOS Parameter Block)が記録されているので、元のC:のBPBを壊さないようコピーします。手順を誤ると非常に危険ですので注意してください。
C:\>DEBUG -L 100 0 0 1 ドライブA:のブートレコードを0100H番地に読み込む -E 2DC "NTLDR " 読み出すファイル名をNTLDRに書き換える -L 1000 2 0 1 ドライブC:のPBRを1000H番地に読み込む -M 100B 103D 10B BPBをコピーする -W 100 2 0 1 ドライブC:のPBRに書き出す -Q C:\>
Wコマンドで書き出す前に、Dコマンドで確認することを強くお勧めします。また、この書き換えたPBRもファイル化しておくとよいでしょう。
最後にFDISKでC:をアクティブに設定し、リブートしてOSローダーから各OSが起動できれば成功です。
BeOSでは、OSローダーにBeOS起動用エントリを追加するためのaddbeosというNT用ツールが付属しています。 これはBeOS.bsというPBRイメージファイルを作ってBOOT.INIを更新します。あるいは、Terminalからddを使ってイメージファイルを作ることもできます。例えばBeOSが2番目の基本パーティションにインストールしてある場合は以下のようにします。
$ mountvolume dos $ dd if=/dev/disk/ide/ata/0/master/0/0_1 of=/dos/BEOS.PBR bs=512 count=1
同様にして、他のパーティションのOSのPBRをファイル化することもできます。 DriveSetupで他のパーティションのマウントを試みる(失敗しても無視してかまいません)と、 /dev/disk下にそのパーティションに対応するデバイスファイルが現れます。
OS/2のブートには、通常、OS/2ブートマネージャーなど他のブートセレクターを併用することになります。 OSローダーから直接ブートする際の問題点については、付録を参照してください。
設定が完了したら、PBRイメージファイルのバックアップをとっておきましょう。とくにDOSとWin95のPBRはイメージファイルの形でしか残らないので、もしPBRイメージファイルが失われてしまうと復旧が面倒です。
以下のようにして、 Win95と旧版DOSの代わりにWin95とMS-DOSモード(MS-DOS 7.0)を選択ブートすることもできそうに思えますが、残念ながらうまくいかないようです。
C:\WIN95.PBR="Windows 95" /win95 C:\WIN95.PBR="MS-DOS 7.0" /win95dos
ここで、MS-DOS 7.0を選択しても、Win95がブートしてしまいます。ブート後のシステムファイルを調べてみると、/win95dosをつけたにもかかわらず、 *.DOSが存在しています。つまり、Win95(MS-DOS 7.0)がブート時にリネームを元に戻しているようです。
AT互換機では、標準のブート処理が貧弱であり、複数のOSを選択ブートするのには向いていません。また、パーティション管理の制約と複雑さもこれに輪をかけています。
この欠点を補うべく、多くのブートセレクターが出回っていますが、
といった問題を常に抱えています。
NTのOSローダーは、ファイル化したPBRを選択実行するという方法により、原理的には多くのOSをブートすることが可能です。 PBRのイメージファイルを用意するのがやや面倒ではあるものの、設定の変更はテキストファイルを編集することで容易に行え、選択ブートの操作性も優れています。
本稿では、このような特長を生かした選択ブートの実現について説明しました。皆さんのOS環境改善の一助となれば幸いです。本稿に対するご意見や改良案、誤りの指摘を歓迎します。
DOSや95に付属しているDEBUGコマンドを用いて PBRを読み書きする例を示します。
C:\>DEBUG -L 100 2 0 1 ドライブC:のPBRを0100H番地に読み込む -N NT40.PBR 書き出すファイル名を指定 -R BX 書き出すサイズを指定 BX 0000 :0 -R CX CX 0000 :200 -W 0100H番地以降を書き出す Writing 0200 bytes -Q C:\>
PBRへの書き出しはとくに注意してください。手順を誤るとOSがブートしなくなるおそれがあります。
C:\>DEBUG NT40.PBR ファイルを0100H番地に読み込む -W 100 2 0 1 ドライブC:のPBRに書き出す -Q C:\>
OS/2は、ブート方法やインストール先パーティションによって、いくつかのインストール形態がありますが、ほとんどの場合、NTのOSローダーからの直接ブートには困難を伴います。
| インストール形態 | ブート可能性 | 備考 | ||
|---|---|---|---|---|
| ブート方法 | パーティション | ファイルシステム | ||
| 2重ブート | 基本(アクティブ) | FAT | △ | BOOTコマンドで切り替えるとPBRの入れ替えが起きるため、再度切り替えるまではOSローダーが起動しなくなります。これを克服しても、 OSローダーではCONFIG.SYSとAUTOEXEC.BATを入れ替えられないため、ブートできるのはDOSとOS/2のうち有効になっている方だけです。 |
| ブートマネージャー または単独 |
基本(アクティブ) | FAT | ○ | C:にDOSを入れることはできません。 |
| HPFS | − | C:がHPFSになるので、 OSローダーを導入する環境としては現実的ではありません。 | ||
| 基本(非アクティブ) | FAT | × | ブートしそうに見えますが、ブートマネージャーの場合と違い、このパーティションがC:にならないので、 OS/2はファイルを見つけられず、ブートできません。 | |
| HPFS | ||||
| ブートマネージャー | 拡張 | FAT | × | まったくブートしません。 |
| HPFS | ||||
結局、OS/2に関しては、NTのOSローダーからの直接ブートはあきらめて、他のブートセレクター(OS/2ブートマネージャーかMBR型のブートセレクター)を併用することになるでしょう。
OS/2ブートマネージャーを使う場合、OS/2を1つしかブートしないのであれば、ブートマネージャーのタイムアウトを短くすることで、見かけ上OSローダーから直接ブートすることができます。ただし、OS/2ブートマネージャーは、基本パーティションを1つ占有するという欠点があります。また、ブートマネージャーのパーティションはファイルシステムではないため、そのPBRをファイル化するには、ディスクBIOSを呼ぶか、UNIXでddを使うか、 BootPartのような専用ツールを使う必要があります。
MBR型ブートセレクターを使う場合は、OSローダーとあわせて2段階の選択操作が必須です。
NTのOSローダーを用いてNT/95/DOSを選択ブートする方法について述べています。本稿の基本的アイデアです。
LinuxのHOWTO文書です。NTのOSローダーを用いてLinuxをブートする方法について述べています。
FreeBSDのFAQ集の一節で、NTのOSローダーを用いたNTとFreeBSDのマルチブートについて述べています。
本稿と同じような内容の文書です。併せて読むと理解が深まるでしょう。 PBRの読み書きを行うツールもあります。
PBRの読み書きを手軽に行うツールです。
MCP試験向けの自習書です。NTのブートの仕組みについて比較的詳しい解説が載っています。
NTのOSローダーに関連して、2台目のHDDにインストールしたFreeBSDをブートする方法について述べています。
OSR2の起動メニューではDOSを起動することができません。これを解決する方法を紹介しています。
AT互換機で複数のOSを動かす方法について、さまざまな角度から考察しています。
各物理HDD(とくに1台目のHDD)の先頭セクタのこと。パーティションテーブルや、アクティブパーティションのPBRを読み出して実行を移すコードが含まれている。
各パーティション(拡張パーティションでは各論理ドライブ)の先頭セクタのこと。そのパーティションのファイルシステムの諸元や、 OSをブートするコードが含まれている。用語としては必ずしも定着しているものではない。
本稿では、複数のOSを選択ブートするプログラムをまとめてこう呼んでいる。
実現の形態から見ると、多い順に以下のようにわけられる。
また、提供形態としては、OSに付属するもの、フリーソフト・シェアウェアとして配布されているもの、単独で市販されているもの(SystemCommander)、などがある。
ARC(Advanced RISC Computing)仕様とは、今は亡きACE(Advanced Computing Environment)コンソーシアム(Compaq、MS、MIPS、DEC、SCO他)が数年前に策定したMIPS R4000ベースのワークステーションの仕様。 BOOT.INIでパーティションを指定する場合には、以下のようにARCの規約にしたがって表記(※)することになっている。
multi(a)disk(b)rdisk(c)partition(d)
aはコントローラーの番号(通常0)、bは常に0、 cは物理ドライブ番号(0〜3)、dはパーティション番号(1〜、基本パーティション優先)
scsi(a)disk(b)rdisk(c)partition(d)
aはコントローラーの番号(0〜)、bはSCSI-ID、 cはLUN、dはパーティション番号
※ なんでそんなのを採用したかというと、下記のBYTEの記事でもわかるように、 NTがOS/2 3.0と呼ばれていたころ、これをIntel x86だけでなくARC仕様機でも動かす予定だったからでしょう。その後NT 3.1としてデビューしたこのOSは、 x86とMIPSに加えてAlphaとPowerPCでも動くようになったわけですが、マルチプラットフォーム化の先鞭となったMIPS版は、PowerPC版ともども、 NT 4.0を最後に消えてしまいました。
ARCに関する参考資料:
OS/2が提供する選択ブートの方法の一つ。 C:にDOSとOS/2を両方インストールし、 BOOTコマンドによって両者を切り替えてブートする (BOOT /DOSまたはBOOT /OS2)。主に、DOSベースのシステムにOS/2を追加インストールするための方法である。
ブートするOSの切り替えは、PBRとCONFIG.SYSとAUTOEXEC.BATを入れ替えることで実現されている。入れ替えによって退避されたPBRとファイルは、 C:\OS2\SYSTEMに*.DOSまたは*.OS2として(一方だけ)保存される。